<?php

namespace app\commission;

use app\award\Award;
use app\award\Up;
use app\controllers\pay\ForController;
use app\models\group\Group;
use app\models\group\GroupFans;
use app\models\marketing\MarketingGroup;
use app\models\merchant\MerchantPayFor;
use app\models\order\Order;
use app\models\merchant\MerchantOrder;
use app\models\order\OrderItem;
use app\models\pay\Pay;
use app\models\product\Product;
use app\models\product\ProductArea;
use app\models\user\User;
use app\models\user\UserAccount;
use app\models\user\UserConsume;
use app\models\UserBalance;
use app\models\UserStore;
use app\models\UserStoreLog;
use app\util\Debug;
use yii\base\BaseObject;

/**
 * order & merchant paid
 *
 * Class PaidFinish
 * @package app\commission
 */
class PaidFinish
{
    /**
     * wx pay paid
     *
     * @param Pay $pay
     */
    public static function paidRun(Pay $pay)
    {
        // 由于客户经常改库存, 这里不要把扣库存放在事务中



        $transaction = \Yii::$app->db->beginTransaction();

        try {

            // order
            // if ($pay->pay_type == 1) {
            //     $order = Order::findOne(['sn' => $pay->sn]);
            //     self::order($order);
            // }

            // refill
            // if ($pay->pay_type == 2) {
            //     // Commission::getInstance()->getRefill()->commission($pay);
            // }

            // merchant
            // if ($pay->pay_type == 3) {
            //     $order = MerchantOrder::findOne(['sn' => $pay->sn]);
            //     self::merchant($order);
            // }

            $order = Order::findOne(['sn' => $pay->sn]);
            if ($order) {
                self::order($order);
            }

            $transaction->commit();

        } catch (\Exception $e) {

            $transaction->rollBack();
            Debug::debug('paid-finish-error', $e->getMessage());
        }
    }

    // order paid (order & group)
    public static function order(Order $order)
    {
        // todo 这里可能需要判断订单 此时的状态为 待支付
        // todo 否则, 如果支付多次, 返佣则会重复

        // order status
        $order->status = Order::$statusMapping['PAID'];

        // 如果是进云仓订单
        if ($order->is_store) {
            $order->status = Order::$statusMapping['FINISH'];
        }

        $order->save();

        // account
        $account = UserAccount::findOne(['user_id' => $order->user_id]);
        if ($order->use_balance > 0) {

            // 改成锁定的余额了
            // $account->balance -= $order->use_balance;
            $account->lock_balance -= $order->use_balance;
        }
        // if ($order->use_score > 0) {
        //     $account->score -= $order->use_score;
        // }
        if ($order->use_platform_ticket > 0) {
            // $account->platform_ticket -= $order->use_platform_ticket;
            $account->lock_platform_ticket -= $order->use_platform_ticket;
        }
        $account->save();

        // consume
        $consume = new UserConsume();
        $consume->user_id = $order->user_id;
        if ($order->use_balance > 0) {
            $consume->balance = $order->use_balance;
        }
        // if ($order->use_score > 0) {
        //     $consume->score = $order->use_score;
        // }
        // if ($order->use_platform_ticket > 0) {
        //     $consume->platform_ticket = $order->use_platform_ticket;
        // }
        $consume->order_id = $order->id;
        $consume->status = 1;
        $consume->text = '下单';
        // if ($order->is_group == 1) {
        //     $consume->text = '下单(拼团)';
        //
        //     $group_id = Group::find()
        //         ->where(['order_id' => $order->id])
        //         ->select(['id'])
        //         ->scalar();
        //     $consume->group_order_id = $group_id;
        // }
        $consume->save();

        // commission or group action
        // if ($order->is_group == 1) {
        //     // action group
        //     self::group($order);
        // } else {
        //     // commission
        //     // Commission::getInstance()->getOrder()->commission($order);
        // }

        // up level
        // 这里处理了升级和佣金
        // UpLevel::up($order);

        // commission & up
        // new C($order);
        // new C2($order);
        // new U($order);


        // 先返佣, 后升级

        // 返佣
        // new CommissionNew($order);
        //
        // // 升级
        // new UpNew($order);


        // 云仓
        if ($order->is_store == 1) {
            // 去除预警
            User::updateAll(['store_warn' => 0], ['id' => $order->user_id]);

            // 记录到云仓
            $store = UserStore::findOne(['user_id' => $order->user_id]);
            if (!$store) {
                $store = new UserStore();
                $store->user_id = $order->user_id;
                $store->num = 0;
            }

            // 云仓日志
            $store_log = UserStoreLog::addLog($order->user_id, $store->num, $order->store_box, $store->num + $order->store_box,
                '下单', 1);

            $store->num += $order->store_box;
            $store->save();

            // 云仓日志订单号
            if (isset($store_log)) {
                $store_log->order_id = $order->id;
                $store_log->save();
            }
        }

        // stock
        $stock = new Stock($order);
        $stock->run();

        new Award($order);
        new Up($order);

        // 84000 系统不返奖
        // $product_id = OrderItem::find()
        //     ->where(['order_id' => $order->id])
        //     ->select(['product_id'])
        //     ->scalar();
        // if (!ProductArea::checkB84000($product_id)) {
        //     // award
        //     new Award($order);
        //     new Up($order);
        // } else {
        //     // 记录到user表
        //     $u = User::findOne(['id' => $order->user_id]);
        //     if ($u->b841 == 0) {
        //         $u->b841 = $product_id;
        //     } else {
        //         $u->b842 = $product_id;
        //     }
        //     $u->save();
        //     $order->add_84 = 1;
        //     $order->status = 10;
        //     $order->save();
        //
        //     // 如果两个都买了
        //     if ($u->b841 > 0 && $u->b842 > 0) {
        //
        //         // 直接给他后台充值 84000
        //         $price1 = Product::find()
        //             ->where(['id' => $u->b841])
        //             ->select(['price'])
        //             ->scalar();
        //         $price2 = Product::find()
        //             ->where(['id' => $u->b842])
        //             ->select(['price'])
        //             ->scalar();
        //
        //         $a = UserAccount::findOne(['user_id' => $u->id]);
        //         if ($a) {
        //
        //             UserBalance::addLog($u->id,
        //                 $a->balance, +($price1 + $price2), $a->balance + ($price1 + $price2), '复合购买84000', 0);
        //
        //             $a->balance += $price1 + $price2;
        //             $a->save();
        //         }
        //
        //         // 创建一个虚拟订单
        //         // $o = new Order();
        //         // $o->sn = Order::generateSn();
        //         // $o->user_id = $order->user_id;
        //         // $o->user_address = $order->user_address;
        //         // $o->log = $order->log;
        //         // $o->is_store = 1;
        //         // $o->store_box = 500;
        //         // $o->is_platform = 1;
        //         // $o->request_params = '';
        //         // $o->total_quantity = 1;
        //         // $o->total_freight = 0;
        //         // $o->total_pay = 84000;
        //         // $o->total_price = 0;
        //         // $o->use_balance = 84000; // 假设为使用余额
        //         // $o->status = 1;
        //         // $o->save();
        //         //
        //         // // 为还要记录云仓
        //         // // todo .....
        //         //
        //         // $item = new OrderItem();
        //         // $item->order_id = $o->id;
        //         // $item->product_id = 0;
        //         // $item->quantity = 1;
        //         // $item->price = 84000;
        //         // $item->is_express = 1;
        //         // $item->save();
        //         //
        //         // // award
        //         // new Award($o);
        //         // new Up($o);
        //     }
        // }

        // award
        // new Award($order);
        // new Up($order);
    }

    // merchant order paid
    // public static function merchant(MerchantOrder $merchantOrder)
    // {
    //     /*
    //      * 1) change merchant order status
    //      * 2) create merchant pay for
    //      * 3) sub account
    //      * 4) add consume
    //      */
    //
    //     $merchantOrder->status = 1;
    //     $merchantOrder->save();
    //
    //     $merchant = \app\models\merchant\Merchant::findOne(['id' => $merchantOrder->merchant_id]);
    //
    //     $amount = $merchantOrder->total * ((100 - $merchant->difference) / 100);
    //
    //     $pay_for = new MerchantPayFor();
    //     $pay_for->sn = MerchantPayFor::generateSn();
    //     $pay_for->user_id = $merchant->user_id;
    //     $pay_for->pay_sn = $merchantOrder->sn;
    //     $pay_for->nickname = $merchant->nickname;
    //     $pay_for->bank_number = $merchant->bank_number;
    //     $pay_for->amount = $amount;
    //     $pay_for->status = 0;
    //     $pay_for->save();
    //
    //     $account = UserAccount::findOne(['user_id' => $merchantOrder->user_id]);
    //     $account->ticket -= $merchantOrder->ticket;
    //     $account->save();
    //
    //     $consume = new UserConsume();
    //     $consume->user_id = $merchantOrder->user_id;
    //     $consume->ticket = $merchantOrder->ticket;
    //     $consume->merchant_order_id = $merchantOrder->id;
    //     $consume->status = 1;
    //     $consume->text = '商家支付';
    //     $consume->save();
    //
    //     // call pay for
    //     ForController::pay(
    //         $pay_for->sn,
    //         $pay_for->user_id,
    //         $pay_for->amount,
    //         $pay_for->bank_number,
    //         $pay_for->nickname,
    //         2,
    //         '付给商家'
    //     );
    // }

    // protected static function group(Order $order)
    // {
    //     // group status
    //     $group = Group::findOne(['order_id' => $order->id]);
    //     if ($group) {
    //         $group->status = 1;
    //         $group->save();
    //     }
    //
    //     // fans status
    //     $fans = GroupFans::findOne(['order_id' => $order->id]);
    //     if ($fans) {
    //         $fans->status = 1;
    //         $fans->save();
    //     }
    //
    //     $params = json_decode($order->request_params);
    //
    //     // join
    //     if (isset($params->group_id) && $params->group_id && $params->group_id > 0) {
    //         self::groupFinish($fans->group_id);
    //     }
    //
    //     // random
    //     if (isset($params->random_group) && $params->random_group) {
    //         self::groupFinish($fans->group_id);
    //     }
    // }
    //
    // protected static function groupFinish($group_id)
    // {
    //     $set = MarketingGroup::getLastOne();
    //     $max = $set->quantity;
    //
    //     $fans_count = GroupFans::find()
    //         ->where(['group_id' => $group_id])
    //         ->andWhere(['status' => 1])
    //         ->count();
    //
    //     if ($fans_count >= $max) {
    //         $group = Group::findOne(['id' => $group_id]);
    //         $group->status = 2;
    //         $group->save();
    //
    //         Commission::getInstance()->getGroup()->commission($group);
    //     }
    //
    // }
}